﻿#define _USE_MATH_DEFINES
#include <graphics.h>
#include <cmath>
#include <ctime>
#include <conio.h>
#include <iostream>
#include <cstdlib>

#define _USE_MATH_DEFINES

const int WIDTH = 800;
const int HEIGHT = 600;

// 绘制缩放后的爱心轮廓
void drawScaledHeart(double scale, COLORREF color) {
    setcolor(color);

    for (double theta = 0; theta <= 2 * M_PI; theta += 0.01) {
        double x = 16 * pow(sin(theta), 3) * scale;
        double y = (13 * cos(theta) - 5 * cos(2 * theta) - 2 * cos(3 * theta) - cos(4 * theta)) * scale;

        int px = (int)x + WIDTH / 2;
        int py = HEIGHT / 2 - (int)y;

        // 边界检查
        if (px >= 0 && px < WIDTH && py >= 0 && py < HEIGHT) {
            putpixel(px, py, color);
        }
    }
}

// 使用EasyX内置函数填充爱心
void fillHeart(double scale, COLORREF color) {
    // 计算爱心中心位置
    int centerX = WIDTH / 2;
    int centerY = HEIGHT / 2;

    // 设置填充颜色
    setfillcolor(color);

    // 确保轮廓颜色与背景不同，形成封闭区域
    setcolor(WHITE);

    // 从中心开始填充
    floodfill(centerX, centerY, WHITE);
}

// 获取随机颜色
COLORREF getRandomColor() {
    // 确保颜色明亮且鲜艳
    int r = rand() % 200 + 55;  // 55-255
    int g = rand() % 200 + 55;  // 55-255
    int b = rand() % 200 + 55;  // 55-255

    return RGB(r, g, b);
}

// 计算缩放值 - 增大基础缩放，让爱心更大
double getScale(double t) {
    // 基础缩放从2.0增加到4.0，变化范围也相应增大
    double scale = 4.0 + 1.0 * sin(t * 2 * M_PI);

    return scale; 
}

// 绘制网格
void drawGrid() {
    setcolor(DARKGRAY);  // 设置网格颜色为深灰色

    // 绘制垂直网格线
    for (int i = 0; i < WIDTH; i += 50) {
        line(i, 0, i, HEIGHT);
    }

    // 绘制水平网格线
    for (int i = 0; i < HEIGHT; i += 50) {
        line(0, i, WIDTH, i);
    }

    // 标记中心点
    setcolor(RED);
    circle(WIDTH / 2, HEIGHT / 2, 3);
}

int main() {
    // 初始化图形窗口
    if (!initgraph(WIDTH, HEIGHT)) {
        std::cerr << "图形窗口初始化失败！" << std::endl;
        _getch();
        return -1;
    }

    // 设置黑色背景
    setbkcolor(BLACK);
    cleardevice();

    // 开始批量绘制
    BeginBatchDraw();

    // 初始化随机数种子
    srand(static_cast<unsigned int>(time(nullptr)));

    double t = 0;
    bool quit = false;

    while (!quit) {
        // 清屏
        cleardevice();

        // 绘制网格
        drawGrid();

        // 计算当前缩放
        double scale = getScale(t);

        // 获取随机颜色
        COLORREF color = getRandomColor();

        // 先绘制白色轮廓，确保形成封闭区域
        drawScaledHeart(scale, WHITE);

        // 填充爱心
        fillHeart(scale, color);

        // 再次绘制轮廓，增强视觉效果
        drawScaledHeart(scale, WHITE);

        // 刷新屏幕
        FlushBatchDraw();

        // 更新时间
        t += 0.05;

        // 控制帧率
        Sleep(50);

        // 检测按键退出
        if (_kbhit() && _getch() != 0) {
            quit = true;
        }
    }

    // 结束批量绘制
    EndBatchDraw();

    // 关闭图形窗口
    closegraph();

    return 0;
}
